package student.aistar.day14;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 问好的通配符
 */
public class WildCardDemo {

    public static void main(String[] args) {
        //只能添加null
        List<?> list = new ArrayList<>();
//        list.add(10);//error
//        list.add("String");//error
//        list.add(null);//true

        List<Integer> intList = new ArrayList<>();
        intList.add(10);
        intList.add(20);
        intList.add(30);

        List<Long> longList = new ArrayList<>();
        longList.add(100L);
        longList.add(200L);
        longList.add(300L);

        //能否定义一个方法,能够打印上面俩个集合
        printList(intList);

        System.out.println("=====");

        printList(longList);
    }


    //泛型是不存在多态的
    //假设认为是List<Number> list = new ArrayList<Long>();//error
    //Integer和Long都是extends Number

    //? extend T - 只能是T类型或者T类型的子类 - 指定类型的上限
    //? super T - 只能是T类型或者T类型的父类- 指定类型的下限

    //建议 - 比较器Collections.sort(List<T> list, Comparator<? super T> c>
    public static void printList(List<? extends Number> list){
        //推荐使用集合的迭代器
        //获取集合的迭代器对象
        Iterator<? extends Number> iterator = list.iterator();
        while (iterator.hasNext()){
            //Integer, Long -> extends -> Number -> 多态的写法
            Number next = iterator.next();
            System.out.println(next);
        }
    }
}
